package towerDefense;

/**
 * Interface to describe all common traits between towers.  
 * 
 * @author Guillermo Mendez-Kestler
 *
 */
public interface I_Tower {

	/**
	 * Maximum HEIGHT of Tower. Tower size based on a square. Default size
	 * is currently set to {@value #DEFAULT_TOWER_SIZE}.
	 * @deprecated
	 */
	public static final int TOWER_HEIGHT = 25;

	/**
	 * Maximum WIDTH of Tower. Tower size based on a square. Default size
	 * is currently set to {@value #DEFAULT_TOWER_SIZE}.
	 * @deprecated
	 */
	public static final int TOWER_WIDTH = 25;

	/**
	 * Minimum default firing radius  of a tower. Currently set to {@value}.
	 */
	public static final int MIN_RADIUS = 1;

	/**
	 * Maximum default firing radius of a tower. Currently set to {@value}.
	 */
	public static final int MAX_RADIUS = 200;

	/**
	 * Maximum LEVEL a tower can achieve, currently set to {@value}.
	 */
	public static final int MAX_TOWER_LEVEL = 5;
	
	/**
	 * The default size of the tower. Default size is set to {@value}. 
	 */
	public static final int DEFAULT_TOWER_SIZE = 10;

	/**
	 * Default initial cost of base TOWER. Currently set to {@value}.
	 */
	public static final int DEFAULT_INITIAL_BUILD_COST = 50;

	/**
	 * The default amount it costs to upgrade a tower. Currently set to {@value}. 
	 */
	public static final int DEFAULT_UPGRADE_COST = 50;

	/**
	 * Returns the current tower level. 
	 * 
	 * @return returns the current tower level. 
	 */
	public int getTowerLevel();

	/**
	 * Returns the range of the Tower (Radius from center of tower)
	 * 
	 * @return Range of tower. 
	 */
	public double getTowerRange();

	/**
	 * Returns the current cost to upgrade this tower. 
	 * 
	 * @return Cost to upgrade the tower. 
	 */
	public int costToUpgrade();

	/**
	 * Upgrades the tower one level. Checks for two conditions. If the tower 
	 * is at the maximum level the upgrade will fail. If the tower upgrade 
	 * level is set to the maximum, the {@link T_Tower#getBuildCost()} will
	 * set the build cost to -1.  
	 * 
	 * @return {@code TRUE} if the upgrade is successful, 
	 * false otherwise. 
	 */
	public boolean upgradeTower();

}
